﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;
using ThanNhanTao.UC;
using DevExpress.Xpf.Core;
using ThanNhanTao.CommonControl;

namespace ThanNhanTao
{
    /// <summary>
    /// Interaction logic for frmThongKeBenhNhanRaVaoKhoa.xaml
    /// </summary>
    public partial class frmThongKeBenhNhanRaVaoKhoa : DXWindow
    {
        public frmThongKeBenhNhanRaVaoKhoa()
        {
            InitializeComponent();
        }

        private void btnThongKe_Click(object sender, RoutedEventArgs e)
        {
            try
            {
                DateTime ngayBatDau = new DateTime(calendar.StartDate.Year, calendar.StartDate.Month, calendar.StartDate.Day, 0, 0, 0);
                DateTime ngayKetThuc = new DateTime(calendar.EndDate.Year, calendar.EndDate.Month, calendar.EndDate.Day, 23, 59, 59);
                ngayKetThuc = CongTruDateTime(ngayKetThuc, 1);

                // Lấy thông tin số lượng BN ra vào khoa từ ngày đến ngày
                List<ThongKeBenhAnBenhNhanDto> dsThongKeBenhNgayLamViec = new List<ThongKeBenhAnBenhNhanDto>();
                dsThongKeBenhNgayLamViec.Add(new ThongKeBenhAnBenhNhanDto
                {
                    TongBenhCu = TongSoBenhCu(ngayBatDau), // Lấy thông tin số lượng BN ra vào khoa từ ngày bắt đầu trở về trước
                    TongBenhVao = TongSoBenhVao(ngayBatDau, ngayKetThuc),
                    TongBenhRa = TongSoBenhRa(ngayBatDau, ngayKetThuc),
                    TongBenhTuVong = TongSoBenhTuVong(ngayBatDau, ngayKetThuc)
                });

                var benhCu = from a in ThanNhanTaoGlobal.DanhSachBenhNhan
                                 where (a.NgayRaVien == null && a.NgayVaoVien.Value < ngayBatDau)
                                                            || (a.NgayRaVien != null && a.NgayVaoVien.Value < ngayBatDau
                                                                                        && a.NgayRaVien.Value >= ngayBatDau)
                                 select new
                                 {
                                     IdBenhNhan = a.IdBenhNhan,
                                     TinhTrangRaVao = "Bệnh cũ",
                                     TenBenhNhan = a.Ho + " " + a.Ten,
                                     ThuTu = 1
                                 };

                var benhVao = from a in ThanNhanTaoGlobal.DanhSachBenhNhan
                                 where (a.NgayVaoVien != null && a.NgayVaoVien.Value >= ngayBatDau && a.NgayVaoVien.Value <= ngayKetThuc)
                                 select new
                                 {
                                     IdBenhNhan = a.IdBenhNhan,
                                     TinhTrangRaVao = "Bệnh vào",
                                     TenBenhNhan = a.Ho + " " + a.Ten,
                                     ThuTu = 2
                                 };

                var benhRa = from a in ThanNhanTaoGlobal.DanhSachBenhNhan
                                 where ((a.NgayRaVien != null && a.NgayRaVien.Value >= ngayBatDau && a.NgayRaVien.Value <= ngayKetThuc) && a.TinhHinhTuVong == 0)
                                         || ((a.NgayRaVien != null && a.NgayRaVien.Value >= ngayBatDau && a.NgayRaVien.Value <= ngayKetThuc) && a.TinhHinhTuVong == 3)
                                         || ((a.NgayRaVien != null && a.NgayRaVien.Value >= ngayBatDau && a.NgayRaVien.Value <= ngayKetThuc) && a.TinhHinhTuVong == 2)
                                 select new
                                 {
                                     IdBenhNhan = a.IdBenhNhan,
                                     TinhTrangRaVao = "Bệnh ra",
                                     TenBenhNhan = a.Ho + " " + a.Ten,
                                     ThuTu = 3
                                 };

                var benhTuVong = from a in ThanNhanTaoGlobal.DanhSachBenhNhan
                                 where (a.TinhHinhTuVong == 1)
                                        && (a.NgayRaVien != null && a.NgayRaVien.Value >= ngayBatDau && a.NgayRaVien.Value <= ngayKetThuc)
                                 select new
                                 {
                                     IdBenhNhan = a.IdBenhNhan,
                                     TinhTrangRaVao = "Bệnh tử vong",
                                     TenBenhNhan = a.Ho + " " + a.Ten,
                                     ThuTu = 4
                                 };

                var tongVao = benhCu.Concat(benhVao);

                // Loại bỏ các bệnh ra
                if (benhRa.Count() > 0)
                {
                    foreach (var item in benhRa)
                    {
                        tongVao = tongVao.Where(u => u.IdBenhNhan != item.IdBenhNhan);
                    }
                }

                // Loại bỏ các bệnh tử vong
                if (benhTuVong.Count() > 0)
                {
                    foreach (var item in benhTuVong)
                    {
                        tongVao = tongVao.Where(u => u.IdBenhNhan != item.IdBenhNhan);
                    }
                }

                // Thiết lập các số còn lại
                var conLai = from a in tongVao
                              select new
                              {
                                   IdBenhNhan = a.IdBenhNhan,
                                   TinhTrangRaVao = "Còn lại",
                                   TenBenhNhan = a.TenBenhNhan,
                                   ThuTu = 5 
                              };

                // Thiết lập các bệnh ra và bệnh tử vong nếu có dữ liệu
                var result = benhCu.Concat(benhVao);
                if (benhRa.Count() > 0)
                {
                    result = result.Concat(benhRa);
                }

                if (benhTuVong.Count() > 0)
                {
                    result = result.Concat(benhTuVong);
                }

                // Cộng với số lượng bệnh nhân còn lại
                if (conLai.Count() > 0)
                {
                    result = result.Concat(conLai);
                }

                gridThongKeBenhAn.ItemsSource = result;
                gridThongKeBenhAn.RefreshData();
            }
            catch
            {
                DXMessageBox.Show("Thống kê không thành công", "Thông báo", MessageBoxButton.OK, MessageBoxImage.Error);
            }
        }

        private void btnDong_Click(object sender, RoutedEventArgs e)
        {
            this.Close();
        }

        private int TongSoBenhVao(DateTime ngayBatDau, DateTime ngayKetThuc)
        {
            return (from a in ThanNhanTaoGlobal.DanhSachBenhNhan
                    where (a.NgayVaoVien != null && a.NgayVaoVien.Value >= ngayBatDau && a.NgayVaoVien.Value <= ngayKetThuc)
                    select a).Count();
        }
        private int TongSoBenhCu(DateTime ngayBatDau)
        {
            return (from a in ThanNhanTaoGlobal.DanhSachBenhNhan
                    where (a.NgayRaVien == null && a.NgayVaoVien.Value < ngayBatDau)
                                                || (a.NgayRaVien != null && a.NgayVaoVien.Value < ngayBatDau
                                                                         && a.NgayRaVien.Value >= ngayBatDau)
                    select a).Count();
        }
        private int TongSoBenhRa(DateTime ngayBatDau, DateTime ngayKetThuc)
        {
            return (from a in ThanNhanTaoGlobal.DanhSachBenhNhan
                    where ((a.NgayRaVien != null && a.NgayRaVien.Value >= ngayBatDau && a.NgayRaVien.Value <= ngayKetThuc) && a.TinhHinhTuVong == 0)
                    || ((a.NgayRaVien != null && a.NgayRaVien.Value >= ngayBatDau && a.NgayRaVien.Value <= ngayKetThuc) && a.TinhHinhTuVong == 3)
                    || ((a.NgayRaVien != null && a.NgayRaVien.Value >= ngayBatDau && a.NgayRaVien.Value <= ngayKetThuc) && a.TinhHinhTuVong == 2)
                    select a).Count();
        }
        private int TongSoBenhTuVong(DateTime ngayBatDau, DateTime ngayKetThuc)
        {
            return (from a in ThanNhanTaoGlobal.DanhSachBenhNhan
                    where (a.TinhHinhTuVong == 1)
                    && (a.NgayRaVien != null && a.NgayRaVien.Value >= ngayBatDau && a.NgayRaVien.Value <= ngayKetThuc)
                    select a).Count();
        }

        private DateTime CongTruDateTime(DateTime ngayLamViec, int soNgay)
        {
            DateTime ketQuaNgay = new DateTime();
            TimeSpan tsngay = new TimeSpan(ngayLamViec.Ticks);
            TimeSpan tsSoNgay = new TimeSpan(soNgay, 0, 0, 0);
            ketQuaNgay = new DateTime(tsngay.Ticks - tsSoNgay.Ticks);
            return ketQuaNgay;
        }
    }

    public class ThongKeBenhNhanRaVaoKhoaDto
    {
        public string TinhTrangRaVao { get; set; }
        public string TenBenhNhan { get; set; }
    }
}
